package com.travel.controller;

import com.travel.common.Result;
import com.travel.domain.entity.Areas;
import com.travel.service.AreasService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.concurrent.TimeUnit;

@Slf4j
@RestController
@RequestMapping("/areas")
public class AreasController {

    @Autowired
    private AreasService areasService;

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    private static final String AREAS_CACHE_KEY = "areas:list";  // 缓存键

    /**
     * 获取区域列表
     * @return 区域列表封装的结果
     */
    @GetMapping("/getAreasList")
    public Result<List<Areas>> getAreasList() {
        // 尝试从缓存中获取区域列表
        List<Areas> cachedAreasList = (List<Areas>) redisTemplate.opsForValue().get(AREAS_CACHE_KEY);

        if (cachedAreasList != null) {
            // 如果缓存中有数据，直接返回缓存数据
            return Result.success(cachedAreasList);
        }

        try {
            // 如果缓存中没有数据，则从数据库查询
            List<Areas> areasList = areasService.listAllAreas();

            // 将查询结果存入缓存，并设置过期时间（如 5 分钟）
            redisTemplate.opsForValue().set(AREAS_CACHE_KEY, areasList, 5, TimeUnit.MINUTES);

            return Result.success(areasList);
        } catch (Exception e) {
            // 捕获异常并记录错误
            log.error("获取区域列表失败: {}", e.getMessage());
            return Result.error("获取区域列表失败");
        }
    }
}
